#include <stdio.h>
#include <stdlib.h>

int main(int argc, char ** argv)
{
    // 1.定义指针变量
    int * pInt;    // 定义整形指针变量pInt
    float * pFloat;     //定义单精度浮点指针变量pFloat
    int i;

    // 2.指针变量与变量的使用
    int dInt = 100;     //定义整形变量dInt，初始值为100
    pInt = &dInt;       //指针变量pInt指向变量dInt的内存地址，此时*pInt和dInt是同质的
    printf("指针变量pInt的值 = %d, 变量dInt的值 = %d\n", *pInt, dInt);

    *pInt = 1001;
    printf("指针变量pInt的值 = %d, 变量dInt的值 = %d\n", *pInt, dInt);

    int dInt2 = 1000;   //定义第二个整形变量dInt2，初始值为1000
    pInt = &dInt2;
    printf("指针变量pInt的值 = %d, 变量dInt的值 = %d\n", *pInt, dInt);

    float floatValue = 100.123f;
    pInt = (int*)&floatValue;       //整形指针pInt指向浮点数的内存地址
    printf("指针变量pInt的值 = %d, 变量floatValue的值 = %f\n", *pInt, floatValue);

    double doubleValue = 123.456;
    pInt = (int*)&doubleValue;
    printf("指针变量pInt的值 = %d, 变量doubleValue的值 = %f\n", *pInt, doubleValue);

    // 3.指针变量与数组
    int iArray[] = {1, 2, 3, 1000, 1001};
    pInt = iArray;              // 数组名就是地址
    for (i = 0; i < 5; i++)
    {
        printf("iArray[%d] = %d\n", i, pInt[i]);
    }

    // 4.为指针变量申请和释放内存
    pInt = (int*)malloc(sizeof(int));
    *pInt = 1234;
    free(pInt);

    pInt = (int*)malloc(sizeof(int) * 10);
    for (i = 0; i < 10; i++)
        pInt[i] = i * i;

    for (i = 0; i < 10; i++)
    {
        printf("%d\t", *(pInt + i));
    }
    printf("\n");
    free(pInt);

    return 0;
}